{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "这道题表面上考察的是列表的相关操作，但是实际上更深却是考察的集合的交集、差集、并集操作。先来看下这道题应该如何完成：  \n",
    "\n",
    "答案  \n",
    "**求交集: list(set(a) & set(b))**\n",
    "\n",
    "**求差集: list(set(a) - set(b))** \n",
    "\n",
    "**求并集: list(set(a) | set(b))**  \n",
    "\n",
    "Tips: 一般情况下，你输出的数据类型应该与原始的数据类型保持一致，这也是为什么我最后都做了一次list强制转换。\n",
    "\n",
    "拓展\n",
    "这个问题涉及了集合的创建以及将列表强制转换为集合，以及集合元运算符的应用，我们先来看下集合的创建。\n",
    "\n",
    "集合的创建有两种形式：\n",
    "\n",
    "使用花括号，用逗号分隔元素， {'Bob', 'John'}\n",
    "使用set构造器，构造器中传入一个可迭代对象。\n",
    "Tips： 集合对象是一种无序的集合数据类型，它是可迭代的，可变的，并且没有重复的元素。所以，我们可以利用集合去实现列表去重。\n",
    "\n",
    "在 Python 里面，集合类型主要指的是集合set和冻结集合frozenSet，它们的主要区别在于：前者是可变的，后者是不可变的。集合主要有以下几种用途：\n",
    "\n",
    "成员检测：和容器对象一样，也可以使用in去查看是否存在某个元素或某些元素。\n",
    "\n",
    "从序列中去除重复项\n",
    "\n",
    "数学中的集合类计算，例如交集、并集、差集与对称差集等等。如给定两个集合 a 和 b：\n",
    "\n",
    "a | b 返回a，b的合集，该运算符等同于a.union(b)\n",
    "\n",
    "a & b 返回a，b的交集，该运算符等同于a.intersection(b)\n",
    "\n",
    "a - b 返回a，b的差集，该运算符等同于a.difference(b)\n",
    "\n",
    "union，intersection，difference的参数都可以接受多个集合对象。\n",
    "\n",
    "Tips：集合并不支持：索引，切片，或者其他序列对象的操作，因为集合并不是一个严格意义上的序列对象。\n",
    "\n",
    "另外。集合的一些其他操作方法你也必须要掌握，因为这些方法在实际工作中使用频率非常高，在这里我列举两个，至于其他的方法有同学们可以查阅下资料，就不一一赘述了。\n",
    "\n",
    "增加新的元素到集合中： a.add(el)\n",
    "从集合中移除元素：a.remove(el)，注意如果元素不存在会引发KeyError。安全的使用方法是a.discard(el)，只删除存在的元素。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}